<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>configurationObjectPattern</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<script>
$(document).ready(function () {
	
	var suv = CarMaker.factory("SUV");
	suv.doors = 11;
	console.log(suv.drive());
	var suv2 = CarMaker.factory("SUV");
	suv2.doors = 22;
	console.log(suv2.drive());
	console.log(suv.drive());
	
});


// 부모 생성자
function CarMaker() {}

// 부모의 메서드
CarMaker.prototype.drive = function () {
	return "Vroom, I have " + this.doors + " doors";
};

// 스태틱 factory 메서드
CarMaker.factory = function (type) {
	var constr = type,
	    newcar;
	    
    // 생성자가 존재하지 않으면 에러를 발생한다
    if (typeof CarMaker[constr] !== "function") {
    	throw {
    		name: "Error",
    		message: constr + " doesn't exist"
    	};
    }
    
    // 생성자의 존재를 확인했으므로 부모를 상속한다
    // 상속은 단 한번만 실행하도록 한다.
    if (typeof CarMaker[constr].prototype.drive !== "function") {
    	CarMaker[constr].prototype = new CarMaker();
    }
    
    // 새로운 인스턴스를 생성한다
    newcar = new CarMaker[constr]();
    
    // 다른 메서드 호출이 필요하면 여기서 실행한 후, 인스턴스를 반환한다.
    return newcar;
};

// 구체적인 자동차 메이커들을 선언한다.
CarMaker.Compact = function () {
	this.doors = 4;
};

CarMaker.Convertible = function () {
	this.doors = 2;
};

CarMaker.SUV = function () {
    this.doors = 24;
};

</script>

</head>
    <body>
	    <h3>Factory 패턴</h3>
    </body>
</html>